Gogs 相关
Gogs 容器内的进程由 S6 管理,S6 会启动 syslogd, crond, openssh 以及 gogs 四个服务,并且这四个服务一定会启动。
而 Gogs 程序内部还有一个内建的 SSH server。
这会导致,如果用户也启用了内建的 SSH server 就会导致容器内有两个 SSH server: 一个是只监听容器内 22 端口的 openssh server;另一个是监听端口可以由用户指定的,Gogs 内建的 SSH server。
这两个 SSH 服务的端口对 docker-run 中 -p 参数的影响是:
-p 10033:22
- 将容器外的 10033 端口转发到容器内的 22 端口上,而这个端口由容器内的 openssh server 使用
- 用户无法更改 openssh server 监听的端口
- 此时可以在 app.ini 配置文件中关闭 Gogs 内建的 SSH server,使用容器中的 openssh server
-p 10033:2333
- 将容器外的 10033 端口转发到容器的 2333 端口上,这个端口被 app.ini 配置文件设为 Gogs 内置 SSH server 监听的端口
- 容器内的 openssh server 依旧监听容器内的 22 端口,只是这个端口从外部不可达
- 由于 openssh server 不可被关闭,所以这个进程实际上只空耗资源,没有任何作用
Gogs 配置文件 app.ini 中 SSH_PORT 字段的值就是 Gogs 内建 SSH server 监听的端口,它还代表 WebUI 上显示的 SSH server 的端口。所以在使用 docker-run 的 -p <host-port>:<containre-port>
参数时,<host-port> 和 SSH_PORT 字段的值保持一致才能让 WebUI 也显示正确的端口。
前面提到了,openssh server 监听的端口不可被修改,所以,如果使用 docker run --network host
参数的话,容器内 openssh server 监听的端口可能与主机上 openssh server 监听的端口冲突,从而报错。